import type { DistrictBoundary } from './useTencentMap'

// 行政区划数据接口
export interface DistrictData {
  provinces: DistrictBoundary[]
  cities: DistrictBoundary[]
  districts: DistrictBoundary[]
}

// 省份代码映射
const PROVINCE_CODES = {
  // '北京市': '110000',
  // '天津市': '120000',
  // '河北省': '130000',
  // '山西省': '140000',
  // '内蒙古自治区': '150000',
  // '辽宁省': '210000',
  // '吉林省': '220000',
  // '黑龙江省': '230000',
  // '上海市': '310000',
  // '江苏省': '320000',
  // '浙江省': '330000',
  // '安徽省': '340000',
  // '福建省': '350000',
  // '江西省': '360000',
  '山东省': '370000',
  // '河南省': '410000',
  // '湖北省': '420000',
  // '湖南省': '430000',
  // '广东省': '440000',
  // '广西壮族自治区': '450000',
  // '海南省': '460000',
  // '重庆市': '500000',
  // '四川省': '510000',
  // '贵州省': '520000',
  // '云南省': '530000',
  // '西藏自治区': '540000',
  // '陕西省': '610000',
  // '甘肃省': '620000',
  // '青海省': '630000',
  // '宁夏回族自治区': '640000',
  // '新疆维吾尔自治区': '650000',
  // '台湾省': '710000',
  // '香港特别行政区': '810000',
  // '澳门特别行政区': '820000'
}

// 缓存已加载的数据
const districtDataCache = new Map<string, any>()

/**
 * 从本地JSON文件加载GeoJSON数据
 */
async function loadGeoJsonFromLocal(adcode: string): Promise<any> {
  try {
    const response = await fetch(`/map-geojson/${adcode}.json`)
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`)
    }
    const geoJson = await response.json()
    return geoJson
  } catch (error) {
    console.warn(`加载本地GeoJSON文件失败 (${adcode}):`, error)
    return null
  }
}

/**
 * 将GeoJSON转换为腾讯地图边界格式
 */
function convertGeoJsonToBoundaries(geoJson: any): any[] {
  if (!geoJson || !geoJson.features) {
    return []
  }

  const boundaries: any[] = []

  geoJson.features.forEach((feature: any) => {
    if (feature.geometry && feature.geometry.coordinates) {
      const { type, coordinates } = feature.geometry

      if (type === 'Polygon') {
        // 单个多边形
        const paths = coordinates[0].map((coord: number[]) => ({
          lat: coord[1],
          lng: coord[0]
        }))
        boundaries.push(paths)
      } else if (type === 'MultiPolygon') {
        // 多个多边形
        coordinates.forEach((polygon: number[][][]) => {
          const paths = polygon[0].map((coord: number[]) => ({
            lat: coord[1],
            lng: coord[0]
          }))
          boundaries.push(paths)
        })
      }
    }
  })

  return boundaries
}

/**
 * 加载单个行政区划的边界数据
 */
export async function loadDistrictBoundary(name: string, adcode: string): Promise<DistrictBoundary | null> {
  try {
    // 检查缓存
    if (districtDataCache.has(adcode)) {
      return districtDataCache.get(adcode)
    }

    // 从本地文件加载GeoJSON数据
    const geoJson = await loadGeoJsonFromLocal(adcode)
    if (!geoJson) {
      return null
    }

    // 转换为边界数据
    const boundaries = convertGeoJsonToBoundaries(geoJson)
    
    const districtBoundary: DistrictBoundary = {
      name,
      level: 'province', // 目前主要处理省级数据
      adcode,
      boundaries
    }

    // 缓存数据
    districtDataCache.set(adcode, districtBoundary)
    
    return districtBoundary
  } catch (error) {
    console.error(`加载行政区划边界失败 (${name}):`, error)
    return null
  }
}

/**
 * 加载所有省份的行政区划数据
 */
export async function loadDistrictData(): Promise<DistrictData> {
  const provinces: DistrictBoundary[] = []
  
  // 并发加载所有省份数据
  const loadPromises = Object.entries(PROVINCE_CODES).map(async ([name, adcode]) => {
    const boundary = await loadDistrictBoundary(name, adcode)
    if (boundary) {
      provinces.push(boundary)
    }
  })

  await Promise.all(loadPromises)

  console.log(`成功加载 ${provinces.length} 个省份的边界数据`)

  return {
    provinces,
    cities: [], // 暂时不加载市级数据
    districts: [] // 暂时不加载区县级数据
  }
}

/**
 * 根据省份名称获取行政区划代码
 */
export function getProvinceCode(provinceName: string): string | undefined {
  return PROVINCE_CODES[provinceName as keyof typeof PROVINCE_CODES]
}

/**
 * 获取所有省份列表
 */
export function getAllProvinces(): Array<{ name: string; code: string }> {
  return Object.entries(PROVINCE_CODES).map(([name, code]) => ({ name, code }))
}

/**
 * 清除缓存
 */
export function clearDistrictDataCache(): void {
  districtDataCache.clear()
}